/**
 * <copyright>
 * </copyright>
 *
 * $Id$
 */
package ccore;

import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EObject;

import ccore.constraint.CConstraint;
import ccore.instance.CObject;
import ccore.model.CClass;
import choco.Problem;

/**
 * <!-- begin-user-doc -->
 * A representation of the model object '<em><b>CCore</b></em>'.
 * <!-- end-user-doc -->
 *
 * <p>
 * The following features are supported:
 * <ul>
 *   <li>{@link ccore.CCore#getCClasses <em>CClasses</em>}</li>
 *   <li>{@link ccore.CCore#getCConstraints <em>CConstraints</em>}</li>
 *   <li>{@link ccore.CCore#getCObjects <em>CObjects</em>}</li>
 *   <li>{@link ccore.CCore#getName <em>Name</em>}</li>
 *   <li>{@link ccore.CCore#getInfinite <em>Infinite</em>}</li>
 *   <li>{@link ccore.CCore#getProblem <em>Problem</em>}</li>
 *   <li>{@link ccore.CCore#getGeneratedConstraints <em>Generated Constraints</em>}</li>
 * </ul>
 * </p>
 *
 * @see ccore.CcorePackage#getCCore()
 * @model
 * @generated
 */
public interface CCore extends EObject {
	/**
	 * Returns the value of the '<em><b>CClasses</b></em>' containment reference list.
	 * The list contents are of type {@link ccore.model.CClass}.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>CClasses</em>' containment reference list isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>CClasses</em>' containment reference list.
	 * @see ccore.CcorePackage#getCCore_CClasses()
	 * @model containment="true"
	 * @generated
	 */
	EList<CClass> getCClasses();

	/**
	 * Returns the value of the '<em><b>CConstraints</b></em>' containment reference list.
	 * The list contents are of type {@link ccore.constraint.CConstraint}.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>CConstraints</em>' containment reference list isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>CConstraints</em>' containment reference list.
	 * @see ccore.CcorePackage#getCCore_CConstraints()
	 * @model containment="true"
	 * @generated
	 */
	EList<CConstraint> getCConstraints();

	/**
	 * Returns the value of the '<em><b>CObjects</b></em>' containment reference list.
	 * The list contents are of type {@link ccore.instance.CObject}.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>CObjects</em>' containment reference list isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>CObjects</em>' containment reference list.
	 * @see ccore.CcorePackage#getCCore_CObjects()
	 * @model containment="true"
	 * @generated
	 */
	EList<CObject> getCObjects();

	/**
	 * Returns the value of the '<em><b>Infinite</b></em>' attribute.
	 * The default value is <code>"1000000"</code>.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Infinite</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Infinite</em>' attribute.
	 * @see #setInfinite(int)
	 * @see ccore.CcorePackage#getCCore_Infinite()
	 * @model default="1000000" required="true"
	 * @generated
	 */
	int getInfinite();

	/**
	 * Sets the value of the '{@link ccore.CCore#getInfinite <em>Infinite</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Infinite</em>' attribute.
	 * @see #getInfinite()
	 * @generated
	 */
	void setInfinite(int value);

	/**
	 * Returns the value of the '<em><b>Problem</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Problem</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Problem</em>' attribute.
	 * @see #setProblem(Problem)
	 * @see ccore.CcorePackage#getCCore_Problem()
	 * @model dataType="ccore.Problem" required="true"
	 * @generated
	 */
	Problem getProblem();

	/**
	 * Sets the value of the '{@link ccore.CCore#getProblem <em>Problem</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Problem</em>' attribute.
	 * @see #getProblem()
	 * @generated
	 */
	void setProblem(Problem value);

	/**
	 * Returns the value of the '<em><b>Generated Constraints</b></em>' containment reference list.
	 * The list contents are of type {@link ccore.constraint.CConstraint}.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Generated Constraints</em>' containment reference list isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Generated Constraints</em>' containment reference list.
	 * @see ccore.CcorePackage#getCCore_GeneratedConstraints()
	 * @model containment="true"
	 * @generated
	 */
	EList<CConstraint> getGeneratedConstraints();

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @model
	 * @generated
	 */
	void initNodes();

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @model
	 * @generated
	 */
	void initClassId();

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @model
	 * @generated
	 */
	void initClassCardinality();

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @model
	 * @generated
	 */
	void initConstraintsVariables();

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @model
	 * @generated
	 */
	void addGeneratedConstraints();

	/**
	 * Returns the value of the '<em><b>Name</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Name</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Name</em>' attribute.
	 * @see #setName(String)
	 * @see ccore.CcorePackage#getCCore_Name()
	 * @model required="true"
	 * @generated
	 */
	String getName();

	/**
	 * Sets the value of the '{@link ccore.CCore#getName <em>Name</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Name</em>' attribute.
	 * @see #getName()
	 * @generated
	 */
	void setName(String value);

} // CCore
